/**
 * @fileOverview DOM操作类
 * @author <a href="mailto:lexloo@126.com">lexloo</a>
 */
(function() {
	if (typeof com.firefly.Dom != 'undefined') {
		return;
	}

	/**
	 * @static
	 * @class Dom操作类
	 * @author <a href="mailto:lexloo@126.com">lexloo</a>
	 */
	com.firefly.Dom = {
		/**
		 * 获取DOM元素
		 * 
		 * @return {HTMLElement} HTML对象
		 */
		getElement : function() {
			var elements = [];

			for ( var i = 0; i < arguments.length; i++) {
				var element = arguments[i];
				if (typeof element == 'string') {
					element = document.getElementById(element);
				}
				if (arguments.length == 1) {
					return element;
				}
				elements.push(element);
			}
			return elements;
		},

		/**
		 * 获取文档Body对象
		 * 
		 * @return {HTMLElement} BODY对象
		 */
		getBody : function() {
			return document.body;
		},

		/**
		 * 创建DOM元素
		 * 
		 * @static
		 * @param {object}
		 *            info 需要创建的元素的信息
		 * @return {HTMLElement} HTML对象
		 */
		createElement : function(info) {
			var el;

			if ($Lang.isString(info)) {
				el = document.createTextNode(info);
			} else {
				el = document.createElement(info.tag);
				delete (info.tag);

				if (!$Lang.isUndefined(info.children)) {
					if ($Lang.isString(info.children) || $Lang.isUndefined(info.children.length)) {
						el.appendChild($E(info.children));
					} else {
						for ( var i = 0, child = null; !$Lang.isUndefined(child = info.children[i]); i++) {
							el.appendChild($E(child));
						}
					}
					delete (info.children);
				}

				for (attr in info) {
					el[attr] = info[attr];
				}
			}
			return el;
		},

		/**
		 * 获取对象当前样式
		 * 
		 * @param {HTMLElement/String}
		 *            element DOM元素
		 * @return {HTMLElement} HTML对象
		 */
		getCurrentStyle : function() {
			if ($Env.isDOMCompatiable) {
				return function(element) {
					element = $(element);

					return element ? window.getComputedStyle(element, '') : {};
				};
			} else {
				return function(element) {
					element = $(element);

					return element ? element.currentStyle : {};
				};
			}
		}(),

		/**
		 * 设置可见性
		 * 
		 * @param {String/Object}
		 *            o DOM元素
		 * @param {Boolean}
		 *            visible 可见性
		 * @param {String}
		 *            type 显示样式，参加CSS-display
		 */
		setVisible : function(o, visible, type) {
			o = $(o);

			if (o) {
				if (visible) {
					o.style.display = type || '';
				} else {
					o.style.display = 'none';
				}
			}
		},

		/**
		 * 获取元素的可见性
		 * 
		 * @param {String/Object}
		 *            o DOM元素
		 * @returns {Boolean} 可见性
		 */
		getVisible : function(o) {
			var o = $(o);

			if (o) {
				return o.style.display == 'none' ? false : true;
			}

			return false;
		},
		/**
		 * 显示切换
		 * 
		 * @param {String,
		 *            Object} o DOM元素
		 */
		toggleDisplay : function(o) {
			$Dom.setVisible(o, !$Dom.getVisible(o), 'block');
		},

		/**
		 * 给对象o设置style属性
		 * 
		 * @param o
		 *            {Object/String} Dom对象
		 * @param style
		 *            {Object} style属性
		 */
		applyStyles : function(o, style) {
			var o = $(o);

			if (o && o.style) {
				$Lang.apply(o.style, style);
			}
		},

		/**
		 * 设定对象的style属性
		 * 
		 * @param o
		 *            {Object/String} DOM 对象
		 * @param styleName
		 *            样式名称
		 * @param styleVlaue
		 *            样式值
		 */
		setStyle : function(o, styleName, styleValue) {
			var o = $(o);

			if (o && o.style) {
				o.style[styleName] = styleValue;
			}
		},

		/**
		 * 获取对象的style属性
		 * 
		 * @param {HTMLElement/String}
		 *            o DOM对象
		 * @param {String}
		 *            className 样式名
		 * @returns {Object} 样式值
		 */
		getStyle : function(o, styleName) {
			var o = $(o);

			if (o && o.style) {
				return o.style[styleName];
			}
		},

		/**
		 * 给Dom对象添加样式类
		 * 
		 * @param {HTMLElement/String}
		 *            o DOM对象
		 * @param {String}
		 *            className 样式名
		 */
		addClass : function(o, className) {
			if ($Lang.isString(o)) {
				o = $(o);
			}

			if (o) {
				o.className = o.className.replace(className, '').trim() + ' ' + className;
			}
		},

		/**
		 * 移除Dom对象的样式类
		 * 
		 * @param {HTMLElement/String}
		 *            o DOM对象
		 * @param {String}
		 *            className 样式名
		 */
		removeClass : function(o, className) {
			o = $(o);

			o.className = o.className.replace(className, '').trim();
		},

		/**
		 * 对象是否包含类
		 * 
		 * @param {HTMLElement/String}
		 *            o DOM对象
		 * @param {String}
		 *            className 样式名
		 * @returns {Boolean} 是否包含类
		 */
		hasClass : function(o, className) {
			return $(o).className.include(className);
		},

		/**
		 * 切换DOM对象的样式类，显示时样式类置于最后
		 * 
		 * @param {HTMLElement/String}
		 *            o DOM对象
		 * @param {String}
		 *            className 样式名
		 */
		toggleClass : function(o, className) {
			o = $(o);
			var cls = o.className;

			if (cls.include(className)) {
				o.className = cls.replace(className, '').trim();
			} else {
				o.className = cls + ' ' + className;
			}
		},

		/**
		 * 设置对象o的样式类，并且移除o的兄弟节点的此样式类
		 * 
		 * @param {HTMLElement/String}
		 *            o DOM对象
		 * @param {String}
		 *            className 样式名
		 */
		radioClass : function(o, className) {
			o = $(o);

			var siblings = o.parentNode.childNodes;
			$A(siblings).each(function(s) {
				if (s.nodeType == 1) {
					$Dom.removeClass(s, className);
				}
			});

			this.addClass(o, className);
		},

		/**
		 * 设置光标标在Dom上的事件处理
		 * 
		 * @param {HTMLElement}
		 *            o 设置的目标对象
		 * @param {Function}
		 *            overFn 光标移上的处理函数
		 * @param {Function}
		 *            outFn 光标移除的处理函数
		 * @param {Object}
		 *            scopt 作用域
		 */
		hover : function(o, overFn, outFn, scope) {
			$XEvent.addListener(o, 'mouseover', overFn.bindAsEventListener(scope || this));
			$XEvent.addListener(o, 'mouseout', outFn.bindAsEventListener(scope || this));
		},

		/**
		 * 获取透明度
		 * 
		 * @param {HTMLElement}
		 *            el 处理对象
		 * @return {Number} 透明度
		 */
		getOpacity : function(el) {
			el = $(el);
			if (el.filters[0])
				return parseFloat(el.filters[0].Opacity / 100.0);
			value = (this.getStyle(el, 'filter') || '').match(/alpha\(opacity=(.*)\)/);
			if (value) {
				if (value[1]) {
					return parseFloat(value[1]) / 100;
				}
			}
			return 1.0;
		},

		/**
		 * Set the opacity of the element
		 * 
		 * @param {Float}
		 *            opacity The new opacity. 0 = transparent, .5 = 50%
		 *            visibile, 1 = fully visible, etc
		 */
		setOpacity : function(o, opacity) {
			var s = o.style;
			if ($Env.isIE) {
				s.zoom = 1;
				s.filter = (s.filter || '').replace(/alpha\([^\)]*\)/gi, "")
						+ (opacity == 1 ? "" : " alpha(opacity=" + opacity * 100 + ")");
			} else {
				s.opacity = opacity;
			}
		},

		/**
		 * 获取视图的宽度
		 * 
		 * @param {Boolean}
		 *            full 是否全部视图
		 * @returns {Number} 宽度
		 */
		getViewWidth : function(full) {
			return full ? this.getDocumentWidth() : this.getViewportWidth();
		},

		/**
		 * 获取视图的高度
		 * 
		 * @param {Boolean}
		 *            full 是否全部视图
		 * @returns {Number} 高度
		 */
		getViewHeight : function(full) {
			return full ? this.getDocumentHeight() : this.getViewportHeight();
		},

		/**
		 * 获取文档宽度
		 * 
		 * @returns {Number} 宽度
		 */
		getDocumentWidth : function() {
			var scrollHeight = (document.compatMode != "CSS1Compat") ? document.body.scrollHeight
					: document.documentElement.scrollHeight;
			return Math.max(scrollHeight, this.getViewportHeight());
		},

		/**
		 * 获取文档高度
		 * 
		 * @returns {Number} 高度
		 */
		getDocumentHeight : function() {
			var scrollWidth = (document.compatMode != "CSS1Compat") ? document.body.scrollWidth
					: document.documentElement.scrollWidth;
			return Math.max(scrollWidth, this.getViewportWidth());
		},

		/**
		 * 获取视图宽度
		 * 
		 * @returns {Number} 宽度
		 */
		getViewportHeight : function() {
			if ($Env.isIE) {
				return $Env.isStrict ? document.documentElement.clientHeight : document.body.clientHeight;
			} else {
				return self.innerHeight;
			}
		},

		/**
		 * 获取视 高度
		 * 
		 * @returns {Number} 高度
		 */
		getViewportWidth : function() {
			if ($Env.isIE) {
				return $Env.isStrict ? document.documentElement.clientWidth : document.body.clientWidth;
			} else {
				return self.innerWidth;
			}
		},

		/**
		 * 返回对象的滚动位置
		 * 
		 * @param {HTMLElement/String}
		 *            el DOM对象
		 * @return {Object} 滚动位置,格式 {left: (scrollLeft), top: (scrollTop)}
		 */
		getScroll : function(el) {
			var d = $(el), doc = document;
			if (d == doc || d == doc.body) {
				var l, t;
				if ($Env.isIE && $Env.isStrict) {
					l = doc.documentElement.scrollLeft || (doc.body.scrollLeft || 0);
					t = doc.documentElement.scrollTop || (doc.body.scrollTop || 0);
				} else {
					l = window.pageXOffset || (doc.body.scrollLeft || 0);
					t = window.pageYOffset || (doc.body.scrollTop || 0);
				}
				return {
					left : l,
					top : t
				};
			} else {
				return {
					left : d.scrollLeft,
					top : d.scrollTop
				};
			}
		},

		/**
		 * 使对象居中，对象必须能够居中，否则没有效果
		 * 
		 * @param {HTMLElement/String}
		 *            el 对象
		 */
		center : function(el) {
			this.setLeft(el, (this.getViewWidth() - this.getWidth(el)) / 2);
			this.setTop(el, (this.getViewHeight() - this.getHeight(el)) / 2);
		},

		/**
		 * 设置DOM元素大小
		 * 
		 * @param {HTMLElement}
		 *            el DOM元素
		 * 
		 */
		setSize : function(el, w, h) {
			el = $(el);
			if (w) {
				this.setWidth(el, w);
			}

			if (h) {
				this.setHeight(el, h);
			}
		},

		/**
		 * 获取对象的尺寸
		 * 
		 * @param {HTMLElement}
		 *            el DOM元素
		 */
		getSize : function(el) {
			return {
				'width' : this.getWidth(el),
				'height' : this.getHeight(el)
			};
		},

		/**
		 * 设置对象的宽度
		 * 
		 * @param {HTMLElement}
		 *            el DOM元素
		 * @param {Number}
		 *            w 宽度
		 */
		setWidth : function(el, w) {
			this.setStyle(el, 'width', w + 'px');
		},

		/**
		 * 获取对象的宽度
		 * 
		 * @param {HTMLElement}
		 *            el DOM元素
		 * 
		 */
		getWidth : function(el) {
			return el.width || parseInt(this.getStyle(el, 'width'), 0);
		},
		/**
		 * 设置对象的高度
		 * 
		 * @param {HTMLElement}
		 *            el DOM元素
		 * @param {Number}
		 *            h 高度
		 */
		setHeight : function(el, h) {
			this.setStyle(el, 'height', h + 'px');
		},
		
		/**
		 * 获取对象的高度
		 * 
		 * @param {HTMLElement}
		 *            el DOM元素
		 * 
		 */
		getHeight : function(el) {
			return el.height || parseInt(this.getStyle(el, 'height'), 0);
		},
		
		/**
		 * 设置对象位置
		 * 
		 * @param x{Number|false}
		 *            x位置,如果为false，则不设置
		 * @param y{Number|false}
		 *            y位置,如果为false，则不设置
		 */
		setLocation : function(el, x, y) {
			if (x) {
				this.setLeft(el, x);
			}

			if (y) {
				this.setTop(el, y);
			}
		},

		/**
		 * 获取对象的位置
		 */
		getLocation : function(el) {
			return {
				'left' : this.getLeft(el),
				'top' : this.getTop(el)
			};
		},

		/**
		 * 设置对象left位置
		 * 
		 * @param x
		 *            {Number} x位置
		 */
		setLeft : function(el, x) {
			this.setStyle(el, 'left', x + 'px');
		},

		/**
		 * 获取对象Left位置
		 */
		getLeft : function(el) {
			return parseInt(this.getStyle(el, 'left'), 10);
		},

		/**
		 * 设置对象top位置
		 * 
		 * @param y
		 *            {Number} y位置
		 */
		setTop : function(el, y) {
			this.setStyle(el, 'top', y + 'px');
		},

		/**
		 * 获取对象的top位置
		 */
		getTop : function(el) {
			return parseInt(this.getStyle(el, 'top'), 10);
		}
	};

	/**
	 * com.firefly.Dom的快捷访问
	 */
	$Dom = com.firefly.Dom;
	/**
	 * $Dom.getElement的快捷使用方式
	 */
	$ = $Dom.getElement;

	/**
	 * $Dom.createElement的快捷使用方式
	 */
	$E = $Dom.createElement;
})();
